#!/bin/bash
# bash_demo.sh - SecureConfig命令行工具的Bash演示脚本

# 设置主密钥环境变量
# 实际使用时请替换为您的真实密钥
export SECURECONFIGMASTERKEY="your_master_key_here"

# 计时开始
START_TIME=$(date +%s)

# 执行secureconfig命令并返回结果
run_secureconfig_command() {
    local command=$1
    shift
    
    echo "正在执行命令: secureconfig $command $@"
    output=$(secureconfig $command "$@" 2>&1)
    exit_code=$?
    
    if [ $exit_code -eq 0 ]; then
        echo "$output"
        return 0
    else
        echo "命令执行失败 (退出码 $exit_code): $output"
        return 1
    fi
}

# 打印结果
print_result() {
    echo -e "\n==== $1 ===="
    if echo "$2" | grep -q '"status": *"success"'; then
        echo "$2"
    else
        error=$(echo "$2" | grep -o '"message": *"[^"]*"' | cut -d'"' -f4)
        echo "失败: $error"
    fi
}

echo -e "\n===== 第一部分: 常规加解密操作 ====="

# 1. 创建 json 配置文件
json_name="demo_json"
echo "创建 json 配置文件: $json_name"
result=$(run_secureconfig_command "create" "$json_name" "--type" "json" "--force")
print_result "创建 json 配置" "$result"

# 2. set-value 仅支持 json
echo "设置 json 配置的值: $json_name app.version = 2.0.0"
result=$(run_secureconfig_command "set-value" "$json_name" "app.version" "2.0.0")
print_result "设置 json 配置值" "$result"

# 3. get-value 仅支持 json
echo "获取 json 配置的值: $json_name app.version"
result=$(run_secureconfig_command "get-value" "$json_name" "app.version")
print_result "获取 json 配置值" "$result"

# 4. 创建 text 文件
text_name="demo_text"
echo "创建 text 文件: $text_name"
result=$(run_secureconfig_command "create" "$text_name" "--type" "text" "--force")
print_result "创建 text 文件" "$result"

# 5. 保存明文内容到 text 文件
text_path="configs/${text_name}.txt"
echo -e "Hello, SecureConfig!\n这是一个文本文件。" > "$text_path"
echo "已写入明文内容到 $text_path"

# 6. 加密 text 文件
echo "加密 text 文件: $text_name"
result=$(run_secureconfig_command "encrypt" "$text_name" "--type" "text")
print_result "加密 text 文件" "$result"

# 7. 解密 text 文件
echo "解密 text 文件: $text_name"
result=$(run_secureconfig_command "decrypt" "$text_name" "--type" "text")
print_result "解密 text 文件" "$result"

# 8. 创建 binary 文件
binary_name="demo_bin"
echo "创建 binary 文件: $binary_name"
result=$(run_secureconfig_command "create" "$binary_name" "--type" "binary" "--force")
print_result "创建 binary 文件" "$result"

# 9. 保存明文内容到 binary 文件
binary_path="configs/${binary_name}.bin"
# 使用 printf 来写入二进制数据
printf "\x00\x01\x02\x03\x04\x05\x06\x07" > "$binary_path"
echo "已写入明文内容到 $binary_path"

# 10. 加密 binary 文件
echo "加密 binary 文件: $binary_name"
result=$(run_secureconfig_command "encrypt" "$binary_name" "--type" "binary")
print_result "加密 binary 文件" "$result"

# 11. 解密 binary 文件
echo "解密 binary 文件: $binary_name"
result=$(run_secureconfig_command "decrypt" "$binary_name" "--type" "binary")
print_result "解密 binary 文件" "$result"

echo -e "\n===== 第二部分: 原地加解密操作 (使用 --inplace 参数) ====="

# 12. 创建原地加密演示文件
inplace_name="inplace_demo"
json_path="configs/${inplace_name}.json"
backup_path="configs/${inplace_name}_backup.json"

echo "创建原地加密演示 json 文件: $inplace_name"
result=$(run_secureconfig_command "create" "$inplace_name" "--type" "json" "--force")
print_result "创建原地加密演示文件" "$result"

# 13. 设置演示文件内容
echo "设置演示文件值: $inplace_name"
result1=$(run_secureconfig_command "set-value" "$inplace_name" "demo.name" "原地加密演示")
result2=$(run_secureconfig_command "set-value" "$inplace_name" "demo.description" "这是一个测试原地加密功能的文件")

# 14. 解密后备份原始明文文件（用于对比）
result=$(run_secureconfig_command "decrypt" "$inplace_name" "--type" "json")
cp "$json_path" "$backup_path"
print_result "设置演示文件值" "$result"
echo "已备份明文文件到 $backup_path"

# 15. 原地加密
echo "原地加密文件: $inplace_name (使用 --inplace 参数)"
result=$(run_secureconfig_command "encrypt" "$inplace_name" "--type" "json" "--inplace")
print_result "原地加密" "$result"

# 16. 验证原地加密结果
if [ -f "configs/${inplace_name}.json.enc" ]; then
    encrypted_json_exists="true"
else
    encrypted_json_exists="false"
fi

if [ -f "$json_path" ]; then
    original_json_exists="true"
else
    original_json_exists="false"
fi

echo "加密文件 (${inplace_name}.json.enc) 是否存在? $encrypted_json_exists"
echo "原始文件 (${inplace_name}.json) 是否存在? $original_json_exists (原地加密，应该存在)"

# 17. 原地解密
echo "原地解密文件: $inplace_name (使用 --inplace 参数)"
result=$(run_secureconfig_command "decrypt" "$inplace_name" "--type" "json" "--inplace")
print_result "原地解密" "$result"

# 18. 验证文件是否相同
if [ -f "$json_path" ] && [ -f "$backup_path" ]; then
    if cmp -s "$json_path" "$backup_path"; then
        are_files_identical="true"
    else
        are_files_identical="false"
    fi
else
    are_files_identical="false"
    echo "比较文件时出错: 有文件不存在"
fi

echo "原地加解密后的文件与原始文件是否相同? $are_files_identical"

# 19. 清理演示文件
echo -e "\n===== 清理演示文件 ====="
files_to_delete=("$json_name" "$text_name" "$binary_name" "$inplace_name")

for name in "${files_to_delete[@]}"; do
    echo "删除文件: $name"
    run_secureconfig_command "delete" "$name" "--type" "json" > /dev/null
done

if [ -f "$backup_path" ]; then
    rm "$backup_path"
    echo "已删除备份文件: $backup_path"
fi

# 20. 演示 get-value/set-value 仅支持 json 的限制
echo -e "\n===== 演示 get-value/set-value 仅支持 json 的限制 ====="

echo "尝试对 text 文件使用 get-value (应报错)"
result=$(run_secureconfig_command "get-value" "$text_name" "app.version" "--type" "text" 2>&1 || echo '{"status": "error", "message": "命令失败"}')
print_result "get-value 用于 text 类型" "$result"

echo "尝试对 binary 文件使用 get-value (应报错)"
result=$(run_secureconfig_command "get-value" "$binary_name" "app.version" "--type" "binary" 2>&1 || echo '{"status": "error", "message": "命令失败"}')
print_result "get-value 用于 binary 类型" "$result"

# 计算总耗时
END_TIME=$(date +%s)
TOTAL_TIME=$((END_TIME - START_TIME))
echo -e "\n全部演示完成，总耗时: $TOTAL_TIME 秒"

# 使用方法:
# 1. 确保已安装SecureConfig工具
# 2. 设置SECURECONFIGMASTERKEY环境变量为您的主密钥
# 3. 给予脚本执行权限: chmod +x demo/bash_demo.sh
# 4. 运行脚本: ./demo/bash_demo.sh 